package com.shanzhu.volunteer.modules.ai.service;

import com.shanzhu.volunteer.modules.ai.dto.RecommendationDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 摘要生成器
 */
@Component
public class SummaryGenerator {
    private static final Logger logger = LoggerFactory.getLogger(SummaryGenerator.class);
    
    /**
     * 学科名称和类别映射
     */
    private static final Map<String, String> SUBJECT_CATEGORIES = new HashMap<>();
    static {
        SUBJECT_CATEGORIES.put("计算机科学与技术", "理工类");
        SUBJECT_CATEGORIES.put("软件工程", "理工类");
        SUBJECT_CATEGORIES.put("人工智能", "理工类");
        SUBJECT_CATEGORIES.put("数据科学与大数据技术", "理工类");
        SUBJECT_CATEGORIES.put("电子信息工程", "理工类");
        SUBJECT_CATEGORIES.put("信息安全", "理工类");
        SUBJECT_CATEGORIES.put("物理学", "理学类");
        SUBJECT_CATEGORIES.put("自动化", "工学类");
        SUBJECT_CATEGORIES.put("通信工程", "工学类");
        SUBJECT_CATEGORIES.put("机械工程", "工学类");
    }
    
    /**
     * 生成分析摘要
     *
     * @param studentFeatures 学生特征
     * @param topMatches 匹配结果
     * @return 分析摘要
     */
    public String generateSummary(Map<String, Object> studentFeatures, List<RecommendationDTO> topMatches) {
        logger.info("生成分析摘要，学生特征：{}，推荐数量：{}", studentFeatures, topMatches.size());
        
        // 获取学生分数
        float score = getFloatValue(studentFeatures.get("score"));
        
        // 获取前三名专业领域
        List<String> topFields = getTopFieldsFromMatches(topMatches);
        
        // 学生特长分析
        List<String> strengths = analyzeStudentStrengths(score);
        
        // 构建摘要
        StringBuilder summary = new StringBuilder();
        
        // 学生分数概况
        if (score > 650) {
            summary.append("该学生成绩优秀，在高分段位于前列。");
        } else if (score > 600) {
            summary.append("该学生成绩良好，属于中上等水平。");
        } else if (score > 550) {
            summary.append("该学生成绩中等，有一定的升学竞争力。");
        } else {
            summary.append("该学生成绩有提升空间，需要合理定位志愿。");
        }
        
        // 学科优势分析
        summary.append("根据分析，该学生在");
        summary.append(String.join("、", strengths));
        summary.append("等方面表现较为突出。");
        
        // 推荐专业领域
        summary.append("综合考虑学科特点、个人能力及发展潜力，");
        summary.append("AI系统建议选择");
        summary.append(String.join("、", topFields));
        summary.append("等相关专业方向。");
        
        // 适配院校分析
        if (topMatches.size() > 0) {
            RecommendationDTO topMatch = topMatches.get(0);
            summary.append("其中，");
            summary.append(topMatch.getCollegeName());
            summary.append("的");
            summary.append(topMatch.getMajorName());
            summary.append("专业与学生个人特点最为匹配，匹配度达");
            summary.append(String.format("%.1f", topMatch.getMatchScore()));
            summary.append("%。");
        }
        
        return summary.toString();
    }
    
    /**
     * 生成专家建议
     *
     * @param studentFeatures 学生特征
     * @param topMatches 匹配结果
     * @return 专家建议
     */
    public String generateExpertAdvice(Map<String, Object> studentFeatures, List<RecommendationDTO> topMatches) {
        logger.info("生成专家建议，学生特征：{}，推荐数量：{}", studentFeatures, topMatches.size());
        
        if (topMatches.isEmpty()) {
            return "暂无足够数据提供专业建议，请完善个人信息后重新尝试。";
        }
        
        // 获取学生分数
        float score = getFloatValue(studentFeatures.get("score"));
        
        // 构建建议
        StringBuilder advice = new StringBuilder();
        advice.append("结合您的学科优势和个人特点，建议将志愿填报策略如下：\n\n");
        
        // 第一批次建议
        if (topMatches.size() >= 1) {
            RecommendationDTO top1 = topMatches.get(0);
            advice.append("1. 第一批次可以考虑");
            advice.append(top1.getCollegeName());
            advice.append("的");
            advice.append(top1.getMajorName());
            advice.append("专业作为首选，该专业");
            if (top1.getTags() != null && !top1.getTags().isEmpty()) {
                advice.append(top1.getTags().get(0));
                advice.append("，");
            }
            advice.append("与您的能力特点高度契合。\n\n");
        }
        
        // 第二批次建议
        if (topMatches.size() >= 3) {
            RecommendationDTO top2 = topMatches.get(1);
            RecommendationDTO top3 = topMatches.get(2);
            advice.append("2. 第二批次可以考虑");
            advice.append(top2.getCollegeName());
            advice.append("或");
            advice.append(top3.getCollegeName());
            advice.append("的相关专业作为备选，这些院校在");
            advice.append(getCommonField(top2.getMajorName(), top3.getMajorName()));
            advice.append("领域也有较强实力。\n\n");
        }
        
        // 冲稳保策略
        advice.append("3. 建议采取\"冲一冲、稳一稳、保一保\"的梯度志愿策略：\n");
        
        // 冲刺院校
        if (score > 600 && topMatches.size() > 0) {
            RecommendationDTO topMatch = topMatches.get(0);
            advice.append("   - 冲刺志愿：").append(topMatch.getCollegeName()).append("\n");
        }
        
        // 稳妥院校
        if (topMatches.size() > 2) {
            RecommendationDTO midMatch = topMatches.get(topMatches.size() > 3 ? 2 : 1);
            advice.append("   - 稳妥志愿：").append(midMatch.getCollegeName()).append("\n");
        }
        
        // 保底院校
        if (topMatches.size() > 4) {
            RecommendationDTO safeMatch = topMatches.get(4);
            advice.append("   - 保底志愿：").append(safeMatch.getCollegeName()).append("\n\n");
        }
        
        // 填报注意事项
        advice.append("4. 填报时特别注意：\n");
        advice.append("   - 关注各院校专业的历年录取分数线变化趋势\n");
        advice.append("   - 考虑地域因素，适当平衡城市分布\n");
        advice.append("   - 了解专业培养方案和未来就业方向\n");
        
        return advice.toString();
    }
    
    /**
     * 分析学生学科优势
     */
    private List<String> analyzeStudentStrengths(float score) {
        List<String> strengths = new ArrayList<>();
        
        // 基于分数区间模拟不同学科优势
        if (score > 650) {
            strengths.add("数学");
            strengths.add("逻辑思维");
            strengths.add("分析能力");
        } else if (score > 600) {
            strengths.add("理科思维");
            strengths.add("实践操作");
        } else {
            strengths.add("应用能力");
            strengths.add("团队协作");
        }
        
        return strengths;
    }
    
    /**
     * 从匹配结果中获取主要专业领域
     */
    private List<String> getTopFieldsFromMatches(List<RecommendationDTO> matches) {
        if (matches == null || matches.isEmpty()) {
            return Arrays.asList("计算机", "电子信息", "自动化");
        }
        
        // 收集专业领域
        Map<String, Integer> fieldCounts = new HashMap<>();
        for (RecommendationDTO match : matches) {
            String field = getFieldFromMajor(match.getMajorName());
            fieldCounts.put(field, fieldCounts.getOrDefault(field, 0) + 1);
        }
        
        // 按出现频率排序
        return fieldCounts.entrySet().stream()
            .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
            .limit(3)
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());
    }
    
    /**
     * 从专业名称获取领域
     */
    private String getFieldFromMajor(String majorName) {
        if (majorName.contains("计算机") || majorName.contains("软件") || majorName.contains("数据")) {
            return "计算机";
        } else if (majorName.contains("电子") || majorName.contains("通信")) {
            return "电子信息";
        } else if (majorName.contains("自动化") || majorName.contains("机械")) {
            return "自动化";
        } else if (majorName.contains("物理")) {
            return "物理";
        } else {
            return "工程类";
        }
    }
    
    /**
     * 获取两个专业的共同领域
     */
    private String getCommonField(String major1, String major2) {
        String field1 = getFieldFromMajor(major1);
        String field2 = getFieldFromMajor(major2);
        
        if (field1.equals(field2)) {
            return field1;
        }
        
        String category1 = SUBJECT_CATEGORIES.getOrDefault(major1, "理工类");
        String category2 = SUBJECT_CATEGORIES.getOrDefault(major2, "理工类");
        
        if (category1.equals(category2)) {
            return category1;
        }
        
        return "相关学科";
    }
    
    /**
     * 安全获取浮点值
     */
    private float getFloatValue(Object value) {
        if (value == null) {
            return 0.0f;
        }
        if (value instanceof Number) {
            return ((Number) value).floatValue();
        }
        try {
            return Float.parseFloat(value.toString());
        } catch (NumberFormatException e) {
            return 0.0f;
        }
    }
} 